perm filename HASH.PAS[S1,ALS]1 blob sn#419037 filedate 1979-02-18 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(*PROGRAM HEADER PAGE*)
C00005 00003	program PRINTHASH (INPUT,OUTPUT)
C00008 00004	function OPC_HASH (var MNEM :  CHAR4) :  integer
C00015 ENDMK
CāŠ—;
(*PROGRAM HEADER PAGE*)

(*PAS10 OPTIONS*) (*$D+,R32,S1300*)			(*X10S1*)

(*							     DEFAULT

D+	DEBUG AND POSTMORTEM DUMP				-
E+	EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED		-
Fn	FILE OPTION						1
I+	FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES		-
L+	OBJECT LISTING						-
Rn	SIZE OF LOW-SEGMENT				(SEE PAS10 MANUAL)
Sn	MAX INSTRUCTIONS PER STATEMENT			       1000
T+	RUNTIME CHECK						+
U+	72 COLUMN FORMAT					-
Xn	HIGHEST REGISTER FOR PARAMETERS				6
*)

(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)

(*							     DEFAULT

A+	GENERATE 370 OBJECT MODULE				-
A-	GENERATE 370 ASSEMBLY MODULE
B+	BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS		-
C+	EMIT PCODE						+
D+	RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES	-
E+	FILE IS IN EBCDIC CHARACTER SET				-
F+	SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY			+
K+	ENABLE STATEMENT EXECUTION COUNTING			-
L+	LIST SOURCE PROGRAM					+
M+	72 COLUMN FORMAT					+
P+	DOUBLE-WORD BOUNDARY ALIGNMENT				-
S+	SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY			+
T+	PRINT SYMBOL TABLES (FOR POST-PROCESSOR)		-
U+	GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR.	-
V+	?? 3RD PCODE BGN INSTRUCTION PARAMETER			-
X+	USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES	-
X-	GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)

(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*)	(*X10S1*)



(*							     DEFAULT

A+	GENERATE S1 ASSEMBLY MODULE				-
A-	GENERATE S1 OBJECT MODULE
*)

(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);

const
(*OPCHTSIZE = 197;
OPCHTSIZEM1 = 196;*)
OPCHTSIZE = 223;
OPCHTSIZEM1 = 222; 
(*OPCHTSIZE = 239; 
OPCHTSIZEM1 = 238;*)
MAX = 2000000;

type
CHAR4 = packed array [1..4] of char;
U_OPCODE = ( U  ,
    UABS , UADD , UAND , UBGN , UCHKF, UCHKH, UCHKL, UCHKN,
    UCHKT, UCHR , UCLAB, UCOMM, UCSP , UCUP , UDEAD, UDEC ,
    UDEF , UDIF , UDIV , UDMD , UDOA , UDUP , UEND , UENT ,
    UEQU , UFJP , UFLO , UFLT , UGEQ , UGRT , UIEQU, UIGEQ,
    UIGRT, UILEQ, UILES, UINC , UIND , UINEQ, UINN , UINT ,
    UIOR , UIXA , ULAB , ULCA , ULDA , ULDC , ULEQ , ULES ,
    ULEX , ULIVE, ULOC , ULOD , UMDEF, UMOD , UMOV , UMPY ,
    UMST , UMUS , UNEG , UNEQ , UNEW , UNOT , UNSTR, UODD ,
    UORD , UOPTN, UPAR , UPLOD, UPSTR, URET , USGS , USQR ,
    USTO , USTP , USTR , USUB , USWP , USYM , UTJP , UTRC ,
    UTYP , UUJP , UUNI , UUNK , UXJP );

var
    I : 0..OPCHTSIZEM1;
    H : 0..OPCHTSIZEM1;
    J : integer;
    K : integer;
    M1,M2,M3,M4 : integer;
    OPC :  U_OPCODE;
    MNEM :  CHAR4;						(*7FEB79 ALS*)

    OPCHASHTAB :  array [0..OPCHTSIZEM1] of
			record
			OPCNAM :  CHAR4;
			OPC :  U_OPCODE;
			HIT : integer
			end (*OPCHASHTAB*);

function OPC_HASH (var MNEM :  CHAR4) :  integer;
    begin
    OPC_HASH :=(((ord(MNEM[1])*M1 + ord(MNEM[2]))*M2 + ord(MNEM[3]))*M3
		 +ord(MNEM[4])*M4) mod OPCHTSIZE;
(*  OPC_HASH := (ord(MNEM[1])*507 + ord(MNEM[2])*26 + ord(MNEM[3])
		 +ord(MNEM[4])*31) mod OPCHTSIZE; *)
(*  OPC_HASH := (ord(MNEM[1])*1024 + ord(MNEM[2])*16 + ord(MNEM[3])*2
		 +ord(MNEM[4])*32) mod OPCHTSIZE; *)
    end (*OPC_HASH*);

procedure ENTER_OPC (NAM :  CHAR4;  OPC :  U_OPCODE);
    var H : 0..OPCHTSIZEM1;
    begin
    H := OPC_HASH(NAM);
    while OPCHASHTAB[H].OPCNAM <> '    ' do
	begin
	H := (H + 1) mod OPCHTSIZE;
	J := J + 1;
	end;
    OPCHASHTAB[H].OPCNAM := NAM;
    OPCHASHTAB[H].OPC := OPC;
(*  OPCHASHTAB[H].HIT := K; *)
    end (*ENTER_OPC*);

procedure PRINT_OPC;
    var H : 0..OPCHTSIZEM1;
    begin
    WRITELN;
    for H := 0 to OPCHTSIZEM1 do
	begin
	WRITE (OUTPUT,H,'  ');
	if OPCHASHTAB[H].OPCNAM = '    ' then WRITELN else
	    begin
	    WRITELN (OUTPUT,OPCHASHTAB[H].OPCNAM,OPCHASHTAB[H].OPC);
(*	    if OPCHASHTAB[H].HIT = 0 then WRITELN else
		WRITELN (OUTPUT,OPCHASHTAB[H].HIT); *)
	    end;
	end;
    end;
  
begin (*MAIN PROGRAM*)
K := 1000;
M1 :=128;
while M1 <= MAX do
  begin (* while M1 <= N *)
  M2 := 1;
  while M1 * M2 <= MAX do
    begin
    M3 := 1;
    while M1 * M2 * M3 <= MAX do
      begin
      M4 := 1;
      while ((M1 * M2 * M3 * M4 <= MAX) and (M4 < 8)) do
	begin

    for I := 0 to OPCHTSIZEM1 do
	OPCHASHTAB[I].OPCNAM := '    ';
    J := 0;
ENTER_OPC ('ABS ', UABS);	ENTER_OPC ('ADD ', UADD);
ENTER_OPC ('AND ', UAND);	ENTER_OPC ('BGN ', UBGN);
ENTER_OPC ('CHKF', UCHKF);	ENTER_OPC ('CHKH', UCHKH);
ENTER_OPC ('CHKL', UCHKL);	ENTER_OPC ('CHKN', UCHKN);
ENTER_OPC ('CHKT', UCHKT);	ENTER_OPC ('CHR ', UCHR);
ENTER_OPC ('CLAB', UCLAB);	ENTER_OPC ('COMM', UCOMM);
ENTER_OPC ('CSP ', UCSP);	ENTER_OPC ('CUP ', UCUP);
ENTER_OPC ('DEAD', UDEAD);	ENTER_OPC ('DEC ', UDEC);
ENTER_OPC ('DEF ', UDEF);	ENTER_OPC ('DIF ', UDIF);
ENTER_OPC ('DIV ', UDIV);	ENTER_OPC ('DMD ', UDMD);
ENTER_OPC ('DOA ', UDOA);	ENTER_OPC ('DUP ', UDUP);
ENTER_OPC ('END ', UEND);	ENTER_OPC ('ENT ', UENT);
ENTER_OPC ('EQU ', UEQU);	ENTER_OPC ('FJP ', UFJP);
ENTER_OPC ('FLO ', UFLO);	ENTER_OPC ('FLT ', UFLT);
ENTER_OPC ('GEQ ', UGEQ);	ENTER_OPC ('GRT ', UGRT);
ENTER_OPC ('IEQU', UIEQU);	ENTER_OPC ('IGEQ', UIGEQ);
ENTER_OPC ('IGRT', UIGRT);	ENTER_OPC ('ILEQ', UILEQ);
ENTER_OPC ('ILES', UILES);	ENTER_OPC ('INC ', UINC);
ENTER_OPC ('IND ', UIND);	ENTER_OPC ('INEQ', UINEQ);
ENTER_OPC ('INN ', UINN);	ENTER_OPC ('INT ', UINT);
ENTER_OPC ('IOR ', UIOR);	ENTER_OPC ('IXA ', UIXA);
ENTER_OPC ('LAB ', ULAB);	ENTER_OPC ('LCA ', ULCA);
ENTER_OPC ('LDA ', ULDA);	ENTER_OPC ('LDC ', ULDC);
ENTER_OPC ('LEQ ', ULEQ);	ENTER_OPC ('LES ', ULES);
ENTER_OPC ('LEX ', ULEX);	ENTER_OPC ('LIVE', ULIVE);
ENTER_OPC ('LOC ', ULOC);	ENTER_OPC ('LOD ', ULOD);
ENTER_OPC ('MDEF', UMDEF);	ENTER_OPC ('MOD ', UMOD);
ENTER_OPC ('MOV ', UMOV);	ENTER_OPC ('MPY ', UMPY);
ENTER_OPC ('MST ', UMST);	ENTER_OPC ('MUS ', UMUS);
ENTER_OPC ('NEG ', UNEG);	ENTER_OPC ('NEQ ', UNEQ);
ENTER_OPC ('NEW ', UNEW);	ENTER_OPC ('NOT ', UNOT);
ENTER_OPC ('NSTR', UNSTR);	ENTER_OPC ('ODD ', UODD);
ENTER_OPC ('ORD ', UORD);	ENTER_OPC ('OPTN', UOPTN);
ENTER_OPC ('PAR ', UPAR);	ENTER_OPC ('PLOD', UPLOD);
ENTER_OPC ('PSTR', UPSTR);	ENTER_OPC ('RET ', URET);
ENTER_OPC ('SGS ', USGS);	ENTER_OPC ('SQR ', USQR);
ENTER_OPC ('STO ', USTO);	ENTER_OPC ('STP ', USTP);
ENTER_OPC ('STR ', USTR);	ENTER_OPC ('SUB ', USUB);
ENTER_OPC ('SWP ', USWP);	ENTER_OPC ('SYM ', USYM);
ENTER_OPC ('TJP ', UTJP);	ENTER_OPC ('TRC ', UTRC);
ENTER_OPC ('TYP ', UTYP);	ENTER_OPC ('UJP ', UUJP);
ENTER_OPC ('UNI ', UUNI);	ENTER_OPC ('UNK ', UUNK);
ENTER_OPC ('XJP ', UXJP);	

      if J < K then
	begin
	K := J;
	WRITELN (OUTPUT,M1,M2,M3,M4,K,' HITS');
	if K = 0 then PRINT_OPC; 
	end; (* if J < K then *)
	M4 := M4*2;
	end; (* while M4 <= M3 do *)
      M3 := M3*2;
      end; (* while M3 <= M2 do *)
    M2 := M2*2;
    end; (* while M2 <= M1 *)
  M1 := M1+1;
  end; (* WHILE M1 < N *)
end. (* main*)